<!--
Part of the Carbon Language project, under the Apache License v2.0 with LLVM
Exceptions. See /LICENSE for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->

<!-- Grab a released highlight.js from one of its CDNs. -->
<link
  rel="stylesheet"
  href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/styles/ir-black.min.css"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min.js"></script>
<script type="module">
  import Carbon from './highlightjs_carbon_lang.js';
  hljs.registerLanguage('Carbon', Carbon);
  hljs.highlightAll();
</script>

<pre><code class="language-carbon">
package Sorting api;
import Core library "io";

fn Partition[T:! Comparable & Movable](s: Slice(T))
      -> i64 {
  var i: i64 = -1;
  let (x: i64, var y: auto) = (1, {.x = {.a = (1, {.k = 42}), .b = 13}, .y = "..."});

  for (e: T in s) {
    if (e <= s.Last()) {
      ++i;
      Swap(&s[i], &e);
    }
  }
  return i;
}

fn QuickSort[T:! Comparable & Movable](s: Slice(T)) {
  if (s.Size() <= 1) {
    return;
  }
  let p: i64 = Partition(s);
  QuickSort(s[:p - 1]));
  QuickSort(s[p + 1:]));
}

interface WidgetI {
}

constraint WidgetC {
}

abstract class Abstract {
  abstract fn DoSomething[self: Self]();
}

base class Widget {
  virtual fn Print[addr self: Self*](var i: i64, x: f32 = 4.2, _: bool);
}

fn Widget.Print[addr self: Self*](var i: i64, x: f32, _: bool, 47) {
  Core.Print("test" + "t\u{FFFF}his");
  Core.Print(
      """
      testing more
      with weird stuff \
      that does stuff
      """);
  Core.Print(
      """c++
      template &lt;typename T&gt; class C {};
      """);
}

class FancyWidget(T:! type) extends Widget {
  impl fn Print[self: Self]();

  impl as Add(T) {
    fn Op[self: Self]();
  }
}

fn FancyWidget(T:! type).Print[self: Self]() {
  Core.Print("more test");
}

impl forall [T:! type] FancyWidget(T) as Printable {
  alias Print = FancyWidget(T).Print;
}
</code></pre>
